go语言开发cmdb资产管理系统,对接kubernetes、云平台、gitlab、Prometheus
精选
原创
Cosmic杰
2022-03-13 21:21:57
©著作权
文章标签
golang-cmdb
cloudplatform
CICD
prometheus
文章分类
Go语言
后端开发
©著作权归作者所有:来自51CTO博客作者Cosmic杰的原创作品,请联系作者获取转载授权,否则将追究法律责任
基于beego-v1.12.3框架开发,这里仅对cmdb一些功能展示、deployment资源的操作核心代码展示;
源码已托管至github:https://github.com/CosmicBDry/gocmdb.git
一.CMDB操作k8s集群
1.cmdb创建deployment资源
1) CMDB的登录界面
![image.png](https://s2.51cto.com/images/20220315/1647318582556255.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2)控制器菜单选择
![image.png](https://s2.51cto.com/images/20220313/1647174397474598.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
3)点击新建按钮,新建deployment项目,填写部署表单
![image.png](https://s2.51cto.com/images/20220313/1647174455252717.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
4)创建后结果如下
![image.png](https://s2.51cto.com/images/20220313/1647174490964076.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
5)k8s集群后端验证已创建成功
![image.png](https://s2.51cto.com/images/20220313/1647174531279203.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2.对deployment资源的实时更新
1)点击配置按钮,对如下pod副本数进行调整
![image.png](https://s2.51cto.com/images/20220313/1647174688909657.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2)查看调整后的副本数
![image.png](https://s2.51cto.com/images/20220313/1647174718633072.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
3)后端验证pod的副本数
![image.png](https://s2.51cto.com/images/20220313/1647174751374526.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
3.deployment资源的删除操作
1)点击删除按钮,弹出确认删除提示
![image.png](https://s2.51cto.com/images/20220313/1647174847480864.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2)删除成功操作
![image.png](https://s2.51cto.com/images/20220313/1647174868715992.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
3)后端验证是否删除
![image.png](https://s2.51cto.com/images/20220313/1647174898602528.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
4.CMDB操作deployment资源核心代码展示
1)k8s的SDK相关的包导入
package models
import (
"context"
"time"
appV1 "k8s.io/api/apps/v1"
coreV1 "k8s.io/api/core/v1"
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
kubeAppV1 "k8s.io/client-go/kubernetes/typed/apps/v1"
"k8s.io/client-go/tools/clientcmd"
)
2)定义一个deployment结构体类型,用于获取接收deployment资源数据
type DeploymentInstace struct {
Name string `json:"app_name" form:"name"`
NameSpace string `json:"namespace" form:"namespace"`
CreationTimestamp time.Time `json:"created_time"`
RevisionHistoryLimit int32 `json:"revision_history_limit" form:"historyVersionLimit"`
Replicas int32 `json:"replicas" form:"replicas"`
AvailableReplicas int32 `json:"available_replicas"`
Labels map[string]string `json:"-" form:"labels"`
ContainerName string `form:"containerName"`
ImgUrl string `form:"imageUrl"`
ContainerPortName string `json:"-"form:"containerPortName"`
ContainerPort int32 `form:"containerPort"`
HostPort int32 `form:"hostPort"`
}
3)调用k8s的api接口获取指定名称空间的deployment资源的数据
func DeploymentInstanceGet(kubeconfig,namespace,deploymentName string) (*DeploymentInstace,error){
//通过kubeconfig集群认证文件生成一个客户端操作对象clientset
clientset,err:=ClienSet(kubeconfig)
if err !=nil{
return nil,err
}
//创建一个deployment资源的接口对象DeploymentClient,用于操作指定名称空间的deployment资源
DeploymentClient:=clientset.AppsV1().Deployments(namespace)
//调用接口对象DeploymentClient中的Get方法,获取相应的deployment资源数据 deploymentInstance,err:=DeploymentClient.Get(context.TODO(),deploymentName,metaV1.GetOptions{})
if err !=nil{
return nil,err
}
//return返回指针类型的deployment结构体类型的实例
return &DeploymentInstace{
Name: deploymentInstance.Name,
NameSpace: deploymentInstance.Namespace,
CreationTimestamp: deploymentInstance.CreationTimestamp.Time,
RevisionHistoryLimit: *deploymentInstance.Spec.RevisionHistoryLimit,
Replicas: *deploymentInstance.Spec.Replicas,
AvailableReplicas: deploymentInstance.Status.AvailableReplicas,
Labels: deploymentInstance.Spec.Selector.MatchLabels ,
ContainerName: deploymentInstance.Spec.Template.Spec.Containers[0].Name,
ImgUrl: deploymentInstance.Spec.Template.Spec.Containers[0].Image,
ContainerPortName: deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].Name ,
ContainerPort: deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort ,
HostPort: deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].HostPort,
},nil
}
4)在集群中创建一个deployment控制器实例
func DeploymentInstanceCreate(kubeconfig string,deployment *DeploymentInstace)error{
//定义deployment资源的创建清单,类似k8s中通过创建yaml清单来部署集群资源
deploymentInstance := &appV1.Deployment{
TypeMeta: metaV1.TypeMeta{ //定义deployment资源的apiVersion、kind类型等
Kind: "Deployment",
APIVersion: "apps/v1",
},
ObjectMeta: metaV1.ObjectMeta{ //定义控制器的metadata:名称、namespace、labels等
Name: deployment.Name,
Namespace: deployment.NameSpace,
Labels: deployment.Labels,
},
Spec: appV1.DeploymentSpec{ //定义deployment控制器的spec字段
Replicas: &deployment.Replicas,
Selector: &metaV1.LabelSelector{
MatchLabels: deployment.Labels,
},
RevisionHistoryLimit: &deployment.RevisionHistoryLimit,
Template: coreV1.PodTemplateSpec{
ObjectMeta: metaV1.ObjectMeta{
//Name: "golang-pod",
Labels: deployment.Labels,
},
Spec: coreV1.PodSpec{
Containers: []coreV1.Container{
coreV1.Container{
Name: deployment.ContainerName,
Image: deployment.ImgUrl,
ImagePullPolicy: coreV1.PullIfNotPresent,
Ports: []coreV1.ContainerPort{
coreV1.ContainerPort{
Name: deployment.ContainerPortName,
ContainerPort: deployment.ContainerPort,
HostPort: deployment.HostPort,
Protocol: coreV1.ProtocolTCP,
},
},
},
},
},
},
},
}
clientset,err:=ClienSet(kubeconfig)
if err !=nil{
return err
}
DeploymentClient:=clientset.AppsV1().Deployments(deployment.NameSpace)
//调用DeploymentClient接口中的create方法,创建deployment资源
_, err = DeploymentClient.Create(context.TODO(), deploymentInstance, metaV1.CreateOptions{})
if err !=nil{
return err
}
return nil
}
5)deployment资源更新
func DeploymentInstanceModify(kubeconfig string,newDeploymentInstance *DeploymentInstace)error{
clientset,err:=ClienSet(kubeconfig)
if err !=nil{
return err
}
DeploymentClient:=clientset.AppsV1().Deployments(newDeploymentInstance.NameSpace)
deploymentInstance,err:=DeploymentClient.Get(context.TODO(),newDeploymentInstance.Name,metaV1.GetOptions{})
if err !=nil{
return err
}
deploymentInstance.Spec.Replicas= &newDeploymentInstance.Replicas
deploymentInstance.Spec.RevisionHistoryLimit =&newDeploymentInstance.RevisionHistoryLimit
deploymentInstance.Spec.Template.Spec.Containers[0].Image= newDeploymentInstance.ImgUrl
deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort = newDeploymentInstance.ContainerPort
deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].HostPort = newDeploymentInstance.HostPort
//调用DeploymentClient接口对象中的update方法,来更新deployment资源
_,err=DeploymentClient.Update(context.TODO(),deploymentInstance,metaV1.UpdateOptions{})
if err !=nil{
return err
}
return nil
}
二.对接腾讯云、阿里云等云平台
1.以下实现是通过调用腾讯云、阿里云自带的api接口(SDK),将云平台注册到CMDB系统
![image.png](https://s2.51cto.com/images/20220313/1647176768263259.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2.调用云平台api抓取到的实例信息,以及对实例的简单操作
![image.png](https://s2.51cto.com/images/20220313/1647176946500249.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
三.CMDB接收prometheus告警通知、job监控节点的配置
1.alertmanager告警通知
![image.png](https://s2.51cto.com/images/20220313/1647177050279843.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2.通过CMDB配置prometheus.yml主配置文件,添加或删除job
![image.png](https://s2.51cto.com/images/20220313/1647177122704795.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
四.CMDB实现CICD流程(结合gitlab、shell脚本或ansible)
1.发布管理菜单
![image.png](https://s2.51cto.com/images/20220313/1647177195558847.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
2.通过gitlab的webhook事件触发,发生代码提交,会自动注册最新提交的项目到cmdb系统,如下可查看项目提交相关信息
![image.png](https://s2.51cto.com/images/20220313/1647177231262042.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
3.发布管理配置,配置master节点、后端发布节点、CICD功能的启用或禁用(生产建议禁用CICD)
![image.png](https://s2.51cto.com/images/20220314/1647247198179623.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
4.查看构建记录文件,通过shell实现对go代码的构建编译
![image.png](https://s2.51cto.com/images/20220313/1647177596254361.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)
赞
收藏
评论
分享
举报
上一篇:k8s集群中部署jenkins、gitlab、nexus实现CICD
|